package org.balthie.demo.jdk.lang.reflect.utils;

import org.springframework.core.ResolvableType;

/**
 * @author：balthie@126.com
 * @createtime ： 2022年8月23日 下午4:16:41
 * @description 北向网关DTO 适配器接口，用于soa-client兼容现有定制DTO
 * @since version 初始于版本 V1.1.1
 */
public interface IRequestAdapter<ConcretePLRequest extends IPLRequest>
{
    /**
     * 
     * @author：balthie@126.com
     * @createtime ： 2022年8月30日 下午4:55:33
     * @description 解析 业务定制类中 的 OHS IPLRequest泛型
     * 
     *              <pre>
     *  public class ExpressCompanyDoMock extends CommonBaseInfoDoMock implements ICreateCampanyReqAdapter
     * {
     * .......
     * }
     *              </pre>
     * 
     *              <pre>
     * public interface ICreateCampanyReqAdapter extends IRequestAdapter<CreateCompanyDocReq>
     * {
     * .......
     * }
     *              </pre>
     * 
     * @see com.viomi.info.client.facade.utils.mock.ExpressCompanyDoMock
     * @since version 初始于版本 1.1.1
     * @return
     */
    @SuppressWarnings("unchecked")
    default Class<ConcretePLRequest> getAdapteeClass()
    {
        ResolvableType adapterRealClazz = ResolvableType.forClass(this.getClass());
        // adapter Interface
        ResolvableType[] adapterInterfaces = adapterRealClazz.getInterfaces();
        for(ResolvableType itf : adapterInterfaces)
        {
            // adapterRealClazz 实现了 IRequestAdapter接口
            if(IRequestAdapter.class.isAssignableFrom(itf.resolve()))
            {
                // adapterRealClazz 直接 implements IRequestAdapter
                if(itf.resolve().equals(IRequestAdapter.class))
                {
                    return (Class<ConcretePLRequest>) itf.getGeneric(0).resolve();
                }
                else
                {
                    // adapterRealClazz 通过 IXXXReqAdapter implements IRequestAdapter
                    return (Class<ConcretePLRequest>) itf.getInterfaces()[0].getGeneric(0).resolve();
                }
            }
        }
        
        return null;
    }
    
    /**
     * 
     * @author：balthie@126.com
     * @createtime ： 2022年8月23日 下午4:17:55
     * @description 将业务定制DTO转换为 DDD北向网关 PL 
     * <p><b>DBS案例：com.viomi.info.client.facade.util.ReqAdapterTransformUtilTest</b>
     * 将业务定制DTO ExpressCompanyDoMock 转换为 CreateCompanyDocReq（实现 document 和 docitem拆分逻辑） 
     * @see CommonStorageCompanyDoService.update
     * @since version 初始于版本 1.1.1
     * @throws AbstractBusinessException
     * @throws IllegalAccessException
     * @throws InstantiationException
     */
    @SuppressWarnings("unchecked")
    default ConcretePLRequest tranTo() throws InstantiationException, IllegalAccessException
    {
        return (ConcretePLRequest) ReqAdapterTransformUtil.trans2PLReq(this);
    }
}
